module ysyx_050369_ctrl (
    input               rst,
    input               i_ex_fence,
    input  [31:0]       i_nxpc,
    input               i_reg_busy,
    input               i_pre_error,
    input   [31:0]      i_mepc    ,
    input   [31:0]      i_metvc  ,
    input               i_ecall_flag,
    input               i_mret_flag,
    input               i_raise_intr,
    input               i_ALU_busy,
    input               i_dcache_stop,
    input               i_icache_stop,
    output reg[3:0]     o_ready,
    output reg [3:0]    o_valid,
    output              o_jump_valid,
    output      [31:0]  o_nxpc,
    output reg          o_pc_stop,
    output              o_pc_error

);

    assign o_pc_error = i_pre_error || i_ecall_flag || i_raise_intr || i_mret_flag;
    assign o_jump_valid = o_pc_error;
    assign  o_nxpc      =   (i_ecall_flag || i_raise_intr)  ? i_metvc :
                            i_mret_flag                     ? i_mepc  :
                            i_pre_error                     ? i_nxpc  :
                            'b0;
    // always @(*) begin
    //     if (rst) begin
    //         o_jump_valid = 'b0;
    //         o_nxpc       = 'b0;
    //     end
    //     else begin
    //         if (i_ecall_flag||i_raise_intr) begin
    //             o_jump_valid = 1'b1;
    //             o_nxpc       = i_metvc;
    //         end
    //         else if (i_mret_flag) begin
    //             o_jump_valid = 1'b1;
    //             o_nxpc       = i_mepc;
    //         end
    //         else if(i_pre_error) begin
    //             o_jump_valid = 1'b1;
    //             o_nxpc       = i_nxpc;
    //         end
    //         else begin
    //             o_jump_valid = 1'b0;
    //             o_nxpc       = i_nxpc;
    //         end
    //     end
    // end
    always @(*) begin
        if(rst)begin
            o_ready     = 'b0;
            o_valid     = 'b0;
            o_pc_stop   = 'b0;
        end
        else begin
            if (o_pc_error && i_dcache_stop &&~i_icache_stop) begin
                o_valid = 4'b0111;
            end
            else if (o_pc_error&&~i_icache_stop) begin
                o_valid = 4'b0011;
            end
            else begin
                o_valid = 4'hf;
            end

            if (i_icache_stop) begin
                o_ready  = 4'b0000;
            end
            else if (i_dcache_stop ||i_ALU_busy) begin
                o_ready  = 4'b0001;
            end
            else if (i_reg_busy &&(~(o_pc_error))) begin
                o_ready  = 4'b0011;
            end
            else begin
                o_ready  = 4'hf;
            end  

            if (i_ex_fence||i_icache_stop||i_dcache_stop ||i_ALU_busy||i_reg_busy &&(~o_pc_error)) begin
                o_pc_stop= 1'b1;
            end
            else begin
                o_pc_stop= 1'b0;
            end
        end
    end
    
endmodule